package com.hxm.demo.test1;

import java.util.Arrays;

/**
 * description: add a description
 *
 * @author huangxiaoming
 * @version 1.0.0
 * @date 2022/10/08 17:38:17
 */
public class TestCovertZ {

    /**
     * 6. Z 字形变换
     *
     * @param args
     */
    public static void main(String[] args) {
        String s = "PAYPALISHIRING";
        int numRows = 3;
        System.out.println(convert(s, numRows));
    }

    /**
     * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
     * <p>
     * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
     * <p>
     * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
     * <p>
     * 请你实现这个将字符串进行指定行数变换的函数：
     *
     * @param s
     * @param numRows
     * @return
     */
//    public static String convert(String s, int numRows) {
//        int n = s.length();
//        int r = numRows;
//        if (r == 1 || r >= n) {
//            return s;
//        }
//        int t = 2 * r - 2;
//        int c = (n + t) / t * (r - 1);
//        char[][] dp = new char[r][c];
//        for (int i = 0, x = 0, y = 0; i < n; i++) {
//            dp[x][y] = s.charAt(i);
//            if (i % t < r - 1) {
//                ++x;
//            } else {
//                --x;
//                ++y;
//            }
//        }
//
//        StringBuffer sb = new StringBuffer();
//        for (char[] row : dp) {
//            for (char col : row) {
//                if (col != 0) {
//                    sb.append(col);
//                }
//            }
//        }
//        return sb.toString();
//    }
    public static String convert(String s, int numRows) {
        if (numRows == 1 || numRows >= s.length()) {
            return s;
        }
        String[] strings = new String[numRows];
        Arrays.fill(strings, "");
        int t = 2 * numRows - 2;
        for (int i = 0, j = 0; i < s.length(); i++) {
            strings[j] += s.charAt(i);
            if (i % t < numRows - 1) {
                ++j;
            } else {
                --j;
            }
        }
        String str = "";
        for (String string : strings) {
            str += string;
        }
        return str;
    }
}
